// 文件名: src/api/request.ts
// 块功能: Axios 实例封装
// 描述: 创建一个单独配置的 Axios 实例，并设置请求拦截器和响应拦截器，用于统一处理 Token、请求日志、响应数据简化和错误处理。

import axios from 'axios'
import type { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios'

// 创建一个 Axios 实例
const service: AxiosInstance = axios.create({
  // 基础 URL，所有请求都会自动添加此前缀
  // .env.development -> VITE_API_BASE_URL = 'http://192.168.101.49:8000'
  baseURL: import.meta.env.VITE_API_BASE_URL,
  // 请求超时时间 (毫秒)
  timeout: 10000,
})

// --- 请求拦截器 ---
// 功能: 在请求发送前进行统一处理
service.interceptors.request.use(
  (config: AxiosRequestConfig) => {
    // 打印请求日志 (仅在开发环境)
    if (import.meta.env.DEV) {
      console.groupCollapsed(`[请求] ${config.method?.toUpperCase()} ${config.url}`)
      console.log('完整请求地址:', (config.baseURL || '') + (config.url || ''))
      if (config.params) console.log('请求参数 (params):', config.params)
      if (config.data) console.log('请求体 (data):', config.data)
      console.groupEnd()
    }

    // 统一添加 Token
    const token = localStorage.getItem('admin-token') // 假设 Token 存储在 localStorage
    if (token && config.headers) {
      config.headers.Authorization = `Bearer ${token}`
    }

    return config
  },
  (error) => {
    // 处理请求配置错误
    console.error('[请求错误]', error)
    return Promise.reject(error)
  },
)

// --- 响应拦截器 ---
// 功能: 在接收到响应后进行统一处理
service.interceptors.response.use(
  (response: AxiosResponse) => {
    // 打印响应日志 (仅在开发环境)
    if (import.meta.env.DEV) {
      console.groupCollapsed(`[响应] 来自 ${response.config.url}`)
      console.log('响应状态码:', response.status)
      console.log('响应数据:', response.data)
      console.groupEnd()
    }

    // 数据简化: 直接返回后端包装的 data 部分
    // 如果后端数据格式是 { code: 200, message: '...', data: { ... } }
    // 您可以在这里进行判断，例如:
    // const res = response.data;
    // if (res.code !== 200) { /* 错误处理 */ return Promise.reject(new Error(res.message)); }
    // return res.data;

    // 如果后端直接返回数据体，则直接返回 response.data
    return response.data
  },
  (error) => {
    // 统一处理 HTTP 网络错误
    if (import.meta.env.DEV) {
      console.groupCollapsed(`[响应错误]`)
      if (error.response) {
        console.error('错误状态码:', error.response.status)
        console.error('错误数据:', error.response.data)
        console.error('请求配置:', error.config)
      } else if (error.request) {
        console.error('请求已发出但无响应:', error.message)
      } else {
        console.error('请求设置错误:', error.message)
      }
      console.groupEnd()
    }

    // 在这里可以根据状态码做全局处理，例如 401 跳转登录页
    if (error.response?.status === 401) {
      // 例如: router.push('/login');
      console.error('认证失败，请重新登录')
    }

    // 将错误继续抛出，以便业务代码可以捕获
    return Promise.reject(error)
  },
)

export default service
